#include <iostream>
using namespace std;
// 两种分类方式：
// 按参数分为：有参构造和无参构造
// 按类型分为：普通构造和拷贝构造
// 三种调用方式：
// 括号法
// 显示法
// 隐式转换法

// 分类
class Person
{
public:
    Person()
    {
        cout << "Person 无参（默认）构造函数调用" << endl;
    }

    Person(int a)
    {
        age = a;
        cout << "Person 有参构造函数调用" << endl;
    }
    // 拷贝构造函数
    Person(const Person &p)
    {
        // 将传入的人身上的所有属性，拷贝到我身上
        age = p.age;
        cout << "Person 拷贝构造函数调用" << endl;
    }

    ~Person()
    {
        cout << "Person 析构函数调用" << endl;
    }
    int age;
};
// 调用
void test01()
{
    // 1.括号法
    // Person p1;     // 默认构造函数调用
    // Person p2(10); // 有参构造函数调用
    // Person p3(p2); // 拷贝构造函数

    // 注意事项1
    // 调用默认构造函数的时候，不要加()
    // 因为这样的话，编译器会认为是一个函数的声明，不会认为在创建对象
    //  cout << "p2的年龄：" << p2.age << endl;
    //  cout << "p3的年龄：" << p3.age << endl;

    //  2.显示法
    Person p1;
    Person p2 = Person(10); // 有参构造
    Person p3 = Person(p2); // 拷贝构造
    // Person(10);             // 匿名对象 特点：当前行执行结束之后，系统会立即回收掉匿名对象
    cout << "aaaaa" << endl;
    // 注意事项2
    // 不要利用拷贝构造函数,初始化匿名对象,编译器会认为Person(p3) === Person p3; 对象声明
    // Person(p3);

    //  3.隐式转换法
    Person p4 = 10; // 相当于Person p4 = Person(10);有参构造
    Person p5 = p4;
}
int main()
{
    test01();
    return 0;
}